<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta content="IE=edge" http-equiv="X-UA-Compatible">
    <meta content="width=device-width, initial-scale=1.0" name="viewport">
    <meta content="Asciidoctor 2.0.10" name="generator">
    <title>IntelliJ IDEA最佳实践</title>
    <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700" rel="stylesheet">
    <style>
        /* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
        /* Uncomment @import statement to use as custom stylesheet */
        /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
        article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section {
            display: block
        }

        audio, video {
            display: inline-block
        }

        audio:not([controls]) {
            display: none;
            height: 0
        }

        html {
            font-family: sans-serif;
            -ms-text-size-adjust: 100%;
            -webkit-text-size-adjust: 100%
        }

        a {
            background: none
        }

        a:focus {
            outline: thin dotted
        }

        a:active, a:hover {
            outline: 0
        }

        h1 {
            font-size: 2em;
            margin: .67em 0
        }

        abbr[title] {
            border-bottom: 1px dotted
        }

        b, strong {
            font-weight: bold
        }

        dfn {
            font-style: italic
        }

        hr {
            -moz-box-sizing: content-box;
            box-sizing: content-box;
            height: 0
        }

        mark {
            background: #ff0;
            color: #000
        }

        code, kbd, pre, samp {
            font-family: monospace;
            font-size: 1em
        }

        pre {
            white-space: pre-wrap
        }

        q {
            quotes: "\201C" "\201D" "\2018" "\2019"
        }

        small {
            font-size: 80%
        }

        sub, sup {
            font-size: 75%;
            line-height: 0;
            position: relative;
            vertical-align: baseline
        }

        sup {
            top: -.5em
        }

        sub {
            bottom: -.25em
        }

        img {
            border: 0
        }

        svg:not(:root) {
            overflow: hidden
        }

        figure {
            margin: 0
        }

        fieldset {
            border: 1px solid silver;
            margin: 0 2px;
            padding: .35em .625em .75em
        }

        legend {
            border: 0;
            padding: 0
        }

        button, input, select, textarea {
            font-family: inherit;
            font-size: 100%;
            margin: 0
        }

        button, input {
            line-height: normal
        }

        button, select {
            text-transform: none
        }

        button, html input[type="button"], input[type="reset"], input[type="submit"] {
            -webkit-appearance: button;
            cursor: pointer
        }

        button[disabled], html input[disabled] {
            cursor: default
        }

        input[type="checkbox"], input[type="radio"] {
            box-sizing: border-box;
            padding: 0
        }

        button::-moz-focus-inner, input::-moz-focus-inner {
            border: 0;
            padding: 0
        }

        textarea {
            overflow: auto;
            vertical-align: top
        }

        table {
            border-collapse: collapse;
            border-spacing: 0
        }

        *, *::before, *::after {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
            box-sizing: border-box
        }

        html, body {
            font-size: 100%
        }

        body {
            background: #fff;
            color: rgba(0, 0, 0, .8);
            padding: 0;
            margin: 0;
            font-family: "Noto Serif", "DejaVu Serif", serif;
            font-weight: 400;
            font-style: normal;
            line-height: 1;
            position: relative;
            cursor: auto;
            tab-size: 4;
            -moz-osx-font-smoothing: grayscale;
            -webkit-font-smoothing: antialiased
        }

        a:hover {
            cursor: pointer
        }

        img, object, embed {
            max-width: 100%;
            height: auto
        }

        object, embed {
            height: 100%
        }

        img {
            -ms-interpolation-mode: bicubic
        }

        .left {
            float: left !important
        }

        .right {
            float: right !important
        }

        .text-left {
            text-align: left !important
        }

        .text-right {
            text-align: right !important
        }

        .text-center {
            text-align: center !important
        }

        .text-justify {
            text-align: justify !important
        }

        .hide {
            display: none
        }

        img, object, svg {
            display: inline-block;
            vertical-align: middle
        }

        textarea {
            height: auto;
            min-height: 50px
        }

        select {
            width: 100%
        }

        .center {
            margin-left: auto;
            margin-right: auto
        }

        .stretch {
            width: 100%
        }

        .subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title {
            line-height: 1.45;
            color: #7a2518;
            font-weight: 400;
            margin-top: 0;
            margin-bottom: .25em
        }

        div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td {
            margin: 0;
            padding: 0;
            direction: ltr
        }

        a {
            color: #2156a5;
            text-decoration: underline;
            line-height: inherit
        }

        a:hover, a:focus {
            color: #1d4b8f
        }

        a img {
            border: 0
        }

        p {
            font-family: inherit;
            font-weight: 400;
            font-size: 1em;
            line-height: 1.6;
            margin-bottom: 1.25em;
            text-rendering: optimizeLegibility
        }

        p aside {
            font-size: .875em;
            line-height: 1.35;
            font-style: italic
        }

        h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {
            font-family: "Open Sans", "DejaVu Sans", sans-serif;
            font-weight: 300;
            font-style: normal;
            color: #ba3925;
            text-rendering: optimizeLegibility;
            margin-top: 1em;
            margin-bottom: .5em;
            line-height: 1.0125em
        }

        h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small {
            font-size: 60%;
            color: #e99b8f;
            line-height: 0
        }

        h1 {
            font-size: 2.125em
        }

        h2 {
            font-size: 1.6875em
        }

        h3, #toctitle, .sidebarblock > .content > .title {
            font-size: 1.375em
        }

        h4, h5 {
            font-size: 1.125em
        }

        h6 {
            font-size: 1em
        }

        hr {
            border: solid #dddddf;
            border-width: 1px 0 0;
            clear: both;
            margin: 1.25em 0 1.1875em;
            height: 0
        }

        em, i {
            font-style: italic;
            line-height: inherit
        }

        strong, b {
            font-weight: bold;
            line-height: inherit
        }

        small {
            font-size: 60%;
            line-height: inherit
        }

        code {
            font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
            font-weight: 400;
            color: rgba(0, 0, 0, .9)
        }

        ul, ol, dl {
            font-size: 1em;
            line-height: 1.6;
            margin-bottom: 1.25em;
            list-style-position: outside;
            font-family: inherit
        }

        ul, ol {
            margin-left: 1.5em
        }

        ul li ul, ul li ol {
            margin-left: 1.25em;
            margin-bottom: 0;
            font-size: 1em
        }

        ul.square li ul, ul.circle li ul, ul.disc li ul {
            list-style: inherit
        }

        ul.square {
            list-style-type: square
        }

        ul.circle {
            list-style-type: circle
        }

        ul.disc {
            list-style-type: disc
        }

        ol li ul, ol li ol {
            margin-left: 1.25em;
            margin-bottom: 0
        }

        dl dt {
            margin-bottom: .3125em;
            font-weight: bold
        }

        dl dd {
            margin-bottom: 1.25em
        }

        abbr, acronym {
            text-transform: uppercase;
            font-size: 90%;
            color: rgba(0, 0, 0, .8);
            border-bottom: 1px dotted #ddd;
            cursor: help
        }

        abbr {
            text-transform: none
        }

        blockquote {
            margin: 0 0 1.25em;
            padding: .5625em 1.25em 0 1.1875em;
            border-left: 1px solid #ddd
        }

        blockquote cite {
            display: block;
            font-size: .9375em;
            color: rgba(0, 0, 0, .6)
        }

        blockquote cite::before {
            content: "\2014 \0020"
        }

        blockquote cite a, blockquote cite a:visited {
            color: rgba(0, 0, 0, .6)
        }

        blockquote, blockquote p {
            line-height: 1.6;
            color: rgba(0, 0, 0, .85)
        }

        @media screen and (min-width: 768px) {
            h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {
                line-height: 1.2
            }

            h1 {
                font-size: 2.75em
            }

            h2 {
                font-size: 2.3125em
            }

            h3, #toctitle, .sidebarblock > .content > .title {
                font-size: 1.6875em
            }

            h4 {
                font-size: 1.4375em
            }
        }

        table {
            background: #fff;
            margin-bottom: 1.25em;
            border: solid 1px #dedede
        }

        table thead, table tfoot {
            background: #f7f8f7
        }

        table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td {
            padding: .5em .625em .625em;
            font-size: inherit;
            color: rgba(0, 0, 0, .8);
            text-align: left
        }

        table tr th, table tr td {
            padding: .5625em .625em;
            font-size: inherit;
            color: rgba(0, 0, 0, .8)
        }

        table tr.even, table tr.alt {
            background: #f8f8f7
        }

        table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td {
            display: table-cell;
            line-height: 1.6
        }

        h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {
            line-height: 1.2;
            word-spacing: -.05em
        }

        h1 strong, h2 strong, h3 strong, #toctitle strong, .sidebarblock > .content > .title strong, h4 strong, h5 strong, h6 strong {
            font-weight: 400
        }

        .clearfix::before, .clearfix::after, .float-group::before, .float-group::after {
            content: " ";
            display: table
        }

        .clearfix::after, .float-group::after {
            clear: both
        }

        :not(pre):not([class^=L]) > code {
            font-size: .9375em;
            font-style: normal !important;
            letter-spacing: 0;
            padding: .1em .5ex;
            word-spacing: -.15em;
            background: #f7f7f8;
            -webkit-border-radius: 4px;
            border-radius: 4px;
            line-height: 1.45;
            text-rendering: optimizeSpeed;
            word-wrap: break-word
        }

        :not(pre) > code.nobreak {
            word-wrap: normal
        }

        :not(pre) > code.nowrap {
            white-space: nowrap
        }

        pre {
            color: rgba(0, 0, 0, .9);
            font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
            line-height: 1.45;
            text-rendering: optimizeSpeed
        }

        pre code, pre pre {
            color: inherit;
            font-size: inherit;
            line-height: inherit
        }

        pre > code {
            display: block
        }

        pre.nowrap, pre.nowrap pre {
            white-space: pre;
            word-wrap: normal
        }

        em em {
            font-style: normal
        }

        strong strong {
            font-weight: 400
        }

        .keyseq {
            color: rgba(51, 51, 51, .8)
        }

        kbd {
            font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
            display: inline-block;
            color: rgba(0, 0, 0, .8);
            font-size: .65em;
            line-height: 1.45;
            background: #f7f7f7;
            border: 1px solid #ccc;
            -webkit-border-radius: 3px;
            border-radius: 3px;
            -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset;
            box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset;
            margin: 0 .15em;
            padding: .2em .5em;
            vertical-align: middle;
            position: relative;
            top: -.1em;
            white-space: nowrap
        }

        .keyseq kbd:first-child {
            margin-left: 0
        }

        .keyseq kbd:last-child {
            margin-right: 0
        }

        .menuseq, .menuref {
            color: #000
        }

        .menuseq b:not(.caret), .menuref {
            font-weight: inherit
        }

        .menuseq {
            word-spacing: -.02em
        }

        .menuseq b.caret {
            font-size: 1.25em;
            line-height: .8
        }

        .menuseq i.caret {
            font-weight: bold;
            text-align: center;
            width: .45em
        }

        b.button::before, b.button::after {
            position: relative;
            top: -1px;
            font-weight: 400
        }

        b.button::before {
            content: "[";
            padding: 0 3px 0 2px
        }

        b.button::after {
            content: "]";
            padding: 0 2px 0 3px
        }

        p a > code:hover {
            color: rgba(0, 0, 0, .9)
        }

        #header, #content, #footnotes, #footer {
            width: 100%;
            margin-left: auto;
            margin-right: auto;
            margin-top: 0;
            margin-bottom: 0;
            max-width: 62.5em;
            *zoom: 1;
            position: relative;
            padding-left: .9375em;
            padding-right: .9375em
        }

        #header::before, #header::after, #content::before, #content::after, #footnotes::before, #footnotes::after, #footer::before, #footer::after {
            content: " ";
            display: table
        }

        #header::after, #content::after, #footnotes::after, #footer::after {
            clear: both
        }

        #content {
            margin-top: 1.25em
        }

        #content::before {
            content: none
        }

        #header > h1:first-child {
            color: rgba(0, 0, 0, .85);
            margin-top: 2.25rem;
            margin-bottom: 0
        }

        #header > h1:first-child + #toc {
            margin-top: 8px;
            border-top: 1px solid #dddddf
        }

        #header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) {
            border-bottom: 1px solid #dddddf;
            padding-bottom: 8px
        }

        #header .details {
            border-bottom: 1px solid #dddddf;
            line-height: 1.45;
            padding-top: .25em;
            padding-bottom: .25em;
            padding-left: .25em;
            color: rgba(0, 0, 0, .6);
            display: -ms-flexbox;
            display: -webkit-flex;
            display: flex;
            -ms-flex-flow: row wrap;
            -webkit-flex-flow: row wrap;
            flex-flow: row wrap
        }

        #header .details span:first-child {
            margin-left: -.125em
        }

        #header .details span.email a {
            color: rgba(0, 0, 0, .85)
        }

        #header .details br {
            display: none
        }

        #header .details br + span::before {
            content: "\00a0\2013\00a0"
        }

        #header .details br + span.author::before {
            content: "\00a0\22c5\00a0";
            color: rgba(0, 0, 0, .85)
        }

        #header .details br + span#revremark::before {
            content: "\00a0|\00a0"
        }

        #header #revnumber {
            text-transform: capitalize
        }

        #header #revnumber::after {
            content: "\00a0"
        }

        #content > h1:first-child:not([class]) {
            color: rgba(0, 0, 0, .85);
            border-bottom: 1px solid #dddddf;
            padding-bottom: 8px;
            margin-top: 0;
            padding-top: 1rem;
            margin-bottom: 1.25rem
        }

        #toc {
            border-bottom: 1px solid #e7e7e9;
            padding-bottom: .5em
        }

        #toc > ul {
            margin-left: .125em
        }

        #toc ul.sectlevel0 > li > a {
            font-style: italic
        }

        #toc ul.sectlevel0 ul.sectlevel1 {
            margin: .5em 0
        }

        #toc ul {
            font-family: "Open Sans", "DejaVu Sans", sans-serif;
            list-style-type: none
        }

        #toc li {
            line-height: 1.3334;
            margin-top: .3334em
        }

        #toc a {
            text-decoration: none
        }

        #toc a:active {
            text-decoration: underline
        }

        #toctitle {
            color: #7a2518;
            font-size: 1.2em
        }

        @media screen and (min-width: 768px) {
            #toctitle {
                font-size: 1.375em
            }

            body.toc2 {
                padding-left: 15em;
                padding-right: 0
            }

            #toc.toc2 {
                margin-top: 0 !important;
                background: #f8f8f7;
                position: fixed;
                width: 15em;
                left: 0;
                top: 0;
                border-right: 1px solid #e7e7e9;
                border-top-width: 0 !important;
                border-bottom-width: 0 !important;
                z-index: 1000;
                padding: 1.25em 1em;
                height: 100%;
                overflow: auto
            }

            #toc.toc2 #toctitle {
                margin-top: 0;
                margin-bottom: .8rem;
                font-size: 1.2em
            }

            #toc.toc2 > ul {
                font-size: .9em;
                margin-bottom: 0
            }

            #toc.toc2 ul ul {
                margin-left: 0;
                padding-left: 1em
            }

            #toc.toc2 ul.sectlevel0 ul.sectlevel1 {
                padding-left: 0;
                margin-top: .5em;
                margin-bottom: .5em
            }

            body.toc2.toc-right {
                padding-left: 0;
                padding-right: 15em
            }

            body.toc2.toc-right #toc.toc2 {
                border-right-width: 0;
                border-left: 1px solid #e7e7e9;
                left: auto;
                right: 0
            }
        }

        @media screen and (min-width: 1280px) {
            body.toc2 {
                padding-left: 20em;
                padding-right: 0
            }

            #toc.toc2 {
                width: 20em
            }

            #toc.toc2 #toctitle {
                font-size: 1.375em
            }

            #toc.toc2 > ul {
                font-size: .95em
            }

            #toc.toc2 ul ul {
                padding-left: 1.25em
            }

            body.toc2.toc-right {
                padding-left: 0;
                padding-right: 20em
            }
        }

        #content #toc {
            border-style: solid;
            border-width: 1px;
            border-color: #e0e0dc;
            margin-bottom: 1.25em;
            padding: 1.25em;
            background: #f8f8f7;
            -webkit-border-radius: 4px;
            border-radius: 4px
        }

        #content #toc > :first-child {
            margin-top: 0
        }

        #content #toc > :last-child {
            margin-bottom: 0
        }

        #footer {
            max-width: 100%;
            background: rgba(0, 0, 0, .8);
            padding: 1.25em
        }

        #footer-text {
            color: rgba(255, 255, 255, .8);
            line-height: 1.44
        }

        #content {
            margin-bottom: .625em
        }

        .sect1 {
            padding-bottom: .625em
        }

        @media screen and (min-width: 768px) {
            #content {
                margin-bottom: 1.25em
            }

            .sect1 {
                padding-bottom: 1.25em
            }
        }

        .sect1:last-child {
            padding-bottom: 0
        }

        .sect1 + .sect1 {
            border-top: 1px solid #e7e7e9
        }

        #content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
            position: absolute;
            z-index: 1001;
            width: 1.5ex;
            margin-left: -1.5ex;
            display: block;
            text-decoration: none !important;
            visibility: hidden;
            text-align: center;
            font-weight: 400
        }

        #content h1 > a.anchor::before, h2 > a.anchor::before, h3 > a.anchor::before, #toctitle > a.anchor::before, .sidebarblock > .content > .title > a.anchor::before, h4 > a.anchor::before, h5 > a.anchor::before, h6 > a.anchor::before {
            content: "\00A7";
            font-size: .85em;
            display: block;
            padding-top: .1em
        }

        #content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover {
            visibility: visible
        }

        #content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link {
            color: #ba3925;
            text-decoration: none
        }

        #content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover {
            color: #a53221
        }

        details, .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock {
            margin-bottom: 1.25em
        }

        details > summary:first-of-type {
            cursor: pointer;
            display: list-item;
            outline: none;
            margin-bottom: .75em
        }

        .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title {
            text-rendering: optimizeLegibility;
            text-align: left;
            font-family: "Noto Serif", "DejaVu Serif", serif;
            font-size: 1rem;
            font-style: italic
        }

        table.tableblock.fit-content > caption.title {
            white-space: nowrap;
            width: 0
        }

        .paragraph.lead > p, #preamble > .sectionbody > [class="paragraph"]:first-of-type p {
            font-size: 1.21875em;
            line-height: 1.6;
            color: rgba(0, 0, 0, .85)
        }

        table.tableblock #preamble > .sectionbody > [class="paragraph"]:first-of-type p {
            font-size: inherit
        }

        .admonitionblock > table {
            border-collapse: separate;
            border: 0;
            background: none;
            width: 100%
        }

        .admonitionblock > table td.icon {
            text-align: center;
            width: 80px
        }

        .admonitionblock > table td.icon img {
            max-width: none
        }

        .admonitionblock > table td.icon .title {
            font-weight: bold;
            font-family: "Open Sans", "DejaVu Sans", sans-serif;
            text-transform: uppercase
        }

        .admonitionblock > table td.content {
            padding-left: 1.125em;
            padding-right: 1.25em;
            border-left: 1px solid #dddddf;
            color: rgba(0, 0, 0, .6)
        }

        .admonitionblock > table td.content > :last-child > :last-child {
            margin-bottom: 0
        }

        .exampleblock > .content {
            border-style: solid;
            border-width: 1px;
            border-color: #e6e6e6;
            margin-bottom: 1.25em;
            padding: 1.25em;
            background: #fff;
            -webkit-border-radius: 4px;
            border-radius: 4px
        }

        .exampleblock > .content > :first-child {
            margin-top: 0
        }

        .exampleblock > .content > :last-child {
            margin-bottom: 0
        }

        .sidebarblock {
            border-style: solid;
            border-width: 1px;
            border-color: #dbdbd6;
            margin-bottom: 1.25em;
            padding: 1.25em;
            background: #f3f3f2;
            -webkit-border-radius: 4px;
            border-radius: 4px
        }

        .sidebarblock > :first-child {
            margin-top: 0
        }

        .sidebarblock > :last-child {
            margin-bottom: 0
        }

        .sidebarblock > .content > .title {
            color: #7a2518;
            margin-top: 0;
            text-align: center
        }

        .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child {
            margin-bottom: 0
        }

        .literalblock pre, .listingblock > .content > pre {
            -webkit-border-radius: 4px;
            border-radius: 4px;
            word-wrap: break-word;
            overflow-x: auto;
            padding: 1em;
            font-size: .8125em
        }

        @media screen and (min-width: 768px) {
            .literalblock pre, .listingblock > .content > pre {
                font-size: .90625em
            }
        }

        @media screen and (min-width: 1280px) {
            .literalblock pre, .listingblock > .content > pre {
                font-size: 1em
            }
        }

        .literalblock pre, .listingblock > .content > pre:not(.highlight), .listingblock > .content > pre[class="highlight"], .listingblock > .content > pre[class^="highlight "] {
            background: #f7f7f8
        }

        .literalblock.output pre {
            color: #f7f7f8;
            background: rgba(0, 0, 0, .9)
        }

        .listingblock > .content {
            position: relative
        }

        .listingblock code[data-lang]::before {
            display: none;
            content: attr(data-lang);
            position: absolute;
            font-size: .75em;
            top: .425rem;
            right: .5rem;
            line-height: 1;
            text-transform: uppercase;
            color: inherit;
            opacity: .5
        }

        .listingblock:hover code[data-lang]::before {
            display: block
        }

        .listingblock.terminal pre .command::before {
            content: attr(data-prompt);
            padding-right: .5em;
            color: inherit;
            opacity: .5
        }

        .listingblock.terminal pre .command:not([data-prompt])::before {
            content: "$"
        }

        .listingblock pre.highlightjs {
            padding: 0
        }

        .listingblock pre.highlightjs > code {
            padding: 1em;
            -webkit-border-radius: 4px;
            border-radius: 4px
        }

        .listingblock pre.prettyprint {
            border-width: 0
        }

        .prettyprint {
            background: #f7f7f8
        }

        pre.prettyprint .linenums {
            line-height: 1.45;
            margin-left: 2em
        }

        pre.prettyprint li {
            background: none;
            list-style-type: inherit;
            padding-left: 0
        }

        pre.prettyprint li code[data-lang]::before {
            opacity: 1
        }

        pre.prettyprint li:not(:first-child) code[data-lang]::before {
            display: none
        }

        table.linenotable {
            border-collapse: separate;
            border: 0;
            margin-bottom: 0;
            background: none
        }

        table.linenotable td[class] {
            color: inherit;
            vertical-align: top;
            padding: 0;
            line-height: inherit;
            white-space: normal
        }

        table.linenotable td.code {
            padding-left: .75em
        }

        table.linenotable td.linenos {
            border-right: 1px solid currentColor;
            opacity: .35;
            padding-right: .5em
        }

        pre.pygments .lineno {
            border-right: 1px solid currentColor;
            opacity: .35;
            display: inline-block;
            margin-right: .75em
        }

        pre.pygments .lineno::before {
            content: "";
            margin-right: -.125em
        }

        .quoteblock {
            margin: 0 1em 1.25em 1.5em;
            display: table
        }

        .quoteblock:not(.excerpt) > .title {
            margin-left: -1.5em;
            margin-bottom: .75em
        }

        .quoteblock blockquote, .quoteblock p {
            color: rgba(0, 0, 0, .85);
            font-size: 1.15rem;
            line-height: 1.75;
            word-spacing: .1em;
            letter-spacing: 0;
            font-style: italic;
            text-align: justify
        }

        .quoteblock blockquote {
            margin: 0;
            padding: 0;
            border: 0
        }

        .quoteblock blockquote::before {
            content: "\201c";
            float: left;
            font-size: 2.75em;
            font-weight: bold;
            line-height: .6em;
            margin-left: -.6em;
            color: #7a2518;
            text-shadow: 0 1px 2px rgba(0, 0, 0, .1)
        }

        .quoteblock blockquote > .paragraph:last-child p {
            margin-bottom: 0
        }

        .quoteblock .attribution {
            margin-top: .75em;
            margin-right: .5ex;
            text-align: right
        }

        .verseblock {
            margin: 0 1em 1.25em
        }

        .verseblock pre {
            font-family: "Open Sans", "DejaVu Sans", sans;
            font-size: 1.15rem;
            color: rgba(0, 0, 0, .85);
            font-weight: 300;
            text-rendering: optimizeLegibility
        }

        .verseblock pre strong {
            font-weight: 400
        }

        .verseblock .attribution {
            margin-top: 1.25rem;
            margin-left: .5ex
        }

        .quoteblock .attribution, .verseblock .attribution {
            font-size: .9375em;
            line-height: 1.45;
            font-style: italic
        }

        .quoteblock .attribution br, .verseblock .attribution br {
            display: none
        }

        .quoteblock .attribution cite, .verseblock .attribution cite {
            display: block;
            letter-spacing: -.025em;
            color: rgba(0, 0, 0, .6)
        }

        .quoteblock.abstract blockquote::before, .quoteblock.excerpt blockquote::before, .quoteblock .quoteblock blockquote::before {
            display: none
        }

        .quoteblock.abstract blockquote, .quoteblock.abstract p, .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p {
            line-height: 1.6;
            word-spacing: 0
        }

        .quoteblock.abstract {
            margin: 0 1em 1.25em;
            display: block
        }

        .quoteblock.abstract > .title {
            margin: 0 0 .375em;
            font-size: 1.15em;
            text-align: center
        }

        .quoteblock.excerpt > blockquote, .quoteblock .quoteblock {
            padding: 0 0 .25em 1em;
            border-left: .25em solid #dddddf
        }

        .quoteblock.excerpt, .quoteblock .quoteblock {
            margin-left: 0
        }

        .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p {
            color: inherit;
            font-size: 1.0625rem
        }

        .quoteblock.excerpt .attribution, .quoteblock .quoteblock .attribution {
            color: inherit;
            text-align: left;
            margin-right: 0
        }

        table.tableblock {
            max-width: 100%;
            border-collapse: separate
        }

        p.tableblock:last-child {
            margin-bottom: 0
        }

        td.tableblock > .content > :last-child {
            margin-bottom: -1.25em
        }

        td.tableblock > .content > :last-child.sidebarblock {
            margin-bottom: 0
        }

        table.tableblock, th.tableblock, td.tableblock {
            border: 0 solid #dedede
        }

        table.grid-all > thead > tr > .tableblock, table.grid-all > tbody > tr > .tableblock {
            border-width: 0 1px 1px 0
        }

        table.grid-all > tfoot > tr > .tableblock {
            border-width: 1px 1px 0 0
        }

        table.grid-cols > * > tr > .tableblock {
            border-width: 0 1px 0 0
        }

        table.grid-rows > thead > tr > .tableblock, table.grid-rows > tbody > tr > .tableblock {
            border-width: 0 0 1px
        }

        table.grid-rows > tfoot > tr > .tableblock {
            border-width: 1px 0 0
        }

        table.grid-all > * > tr > .tableblock:last-child, table.grid-cols > * > tr > .tableblock:last-child {
            border-right-width: 0
        }

        table.grid-all > tbody > tr:last-child > .tableblock, table.grid-all > thead:last-child > tr > .tableblock, table.grid-rows > tbody > tr:last-child > .tableblock, table.grid-rows > thead:last-child > tr > .tableblock {
            border-bottom-width: 0
        }

        table.frame-all {
            border-width: 1px
        }

        table.frame-sides {
            border-width: 0 1px
        }

        table.frame-topbot, table.frame-ends {
            border-width: 1px 0
        }

        table.stripes-all tr, table.stripes-odd tr:nth-of-type(odd), table.stripes-even tr:nth-of-type(even), table.stripes-hover tr:hover {
            background: #f8f8f7
        }

        th.halign-left, td.halign-left {
            text-align: left
        }

        th.halign-right, td.halign-right {
            text-align: right
        }

        th.halign-center, td.halign-center {
            text-align: center
        }

        th.valign-top, td.valign-top {
            vertical-align: top
        }

        th.valign-bottom, td.valign-bottom {
            vertical-align: bottom
        }

        th.valign-middle, td.valign-middle {
            vertical-align: middle
        }

        table thead th, table tfoot th {
            font-weight: bold
        }

        tbody tr th {
            display: table-cell;
            line-height: 1.6;
            background: #f7f8f7
        }

        tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p {
            color: rgba(0, 0, 0, .8);
            font-weight: bold
        }

        p.tableblock > code:only-child {
            background: none;
            padding: 0
        }

        p.tableblock {
            font-size: 1em
        }

        ol {
            margin-left: 1.75em
        }

        ul li ol {
            margin-left: 1.5em
        }

        dl dd {
            margin-left: 1.125em
        }

        dl dd:last-child, dl dd:last-child > :last-child {
            margin-bottom: 0
        }

        ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist {
            margin-bottom: .625em
        }

        ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled {
            list-style-type: none
        }

        ul.no-bullet, ol.no-bullet, ol.unnumbered {
            margin-left: .625em
        }

        ul.unstyled, ol.unstyled {
            margin-left: 0
        }

        ul.checklist {
            margin-left: .625em
        }

        ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child {
            width: 1.25em;
            font-size: .8em;
            position: relative;
            bottom: .125em
        }

        ul.checklist li > p:first-child > input[type="checkbox"]:first-child {
            margin-right: .25em
        }

        ul.inline {
            display: -ms-flexbox;
            display: -webkit-box;
            display: flex;
            -ms-flex-flow: row wrap;
            -webkit-flex-flow: row wrap;
            flex-flow: row wrap;
            list-style: none;
            margin: 0 0 .625em -1.25em
        }

        ul.inline > li {
            margin-left: 1.25em
        }

        .unstyled dl dt {
            font-weight: 400;
            font-style: normal
        }

        ol.arabic {
            list-style-type: decimal
        }

        ol.decimal {
            list-style-type: decimal-leading-zero
        }

        ol.loweralpha {
            list-style-type: lower-alpha
        }

        ol.upperalpha {
            list-style-type: upper-alpha
        }

        ol.lowerroman {
            list-style-type: lower-roman
        }

        ol.upperroman {
            list-style-type: upper-roman
        }

        ol.lowergreek {
            list-style-type: lower-greek
        }

        .hdlist > table, .colist > table {
            border: 0;
            background: none
        }

        .hdlist > table > tbody > tr, .colist > table > tbody > tr {
            background: none
        }

        td.hdlist1, td.hdlist2 {
            vertical-align: top;
            padding: 0 .625em
        }

        td.hdlist1 {
            font-weight: bold;
            padding-bottom: 1.25em
        }

        .literalblock + .colist, .listingblock + .colist {
            margin-top: -.5em
        }

        .colist td:not([class]):first-child {
            padding: .4em .75em 0;
            line-height: 1;
            vertical-align: top
        }

        .colist td:not([class]):first-child img {
            max-width: none
        }

        .colist td:not([class]):last-child {
            padding: .25em 0
        }

        .thumb, .th {
            line-height: 0;
            display: inline-block;
            border: solid 4px #fff;
            -webkit-box-shadow: 0 0 0 1px #ddd;
            box-shadow: 0 0 0 1px #ddd
        }

        .imageblock.left {
            margin: .25em .625em 1.25em 0
        }

        .imageblock.right {
            margin: .25em 0 1.25em .625em
        }

        .imageblock > .title {
            margin-bottom: 0
        }

        .imageblock.thumb, .imageblock.th {
            border-width: 6px
        }

        .imageblock.thumb > .title, .imageblock.th > .title {
            padding: 0 .125em
        }

        .image.left, .image.right {
            margin-top: .25em;
            margin-bottom: .25em;
            display: inline-block;
            line-height: 0
        }

        .image.left {
            margin-right: .625em
        }

        .image.right {
            margin-left: .625em
        }

        a.image {
            text-decoration: none;
            display: inline-block
        }

        a.image object {
            pointer-events: none
        }

        sup.footnote, sup.footnoteref {
            font-size: .875em;
            position: static;
            vertical-align: super
        }

        sup.footnote a, sup.footnoteref a {
            text-decoration: none
        }

        sup.footnote a:active, sup.footnoteref a:active {
            text-decoration: underline
        }

        #footnotes {
            padding-top: .75em;
            padding-bottom: .75em;
            margin-bottom: .625em
        }

        #footnotes hr {
            width: 20%;
            min-width: 6.25em;
            margin: -.25em 0 .75em;
            border-width: 1px 0 0
        }

        #footnotes .footnote {
            padding: 0 .375em 0 .225em;
            line-height: 1.3334;
            font-size: .875em;
            margin-left: 1.2em;
            margin-bottom: .2em
        }

        #footnotes .footnote a:first-of-type {
            font-weight: bold;
            text-decoration: none;
            margin-left: -1.05em
        }

        #footnotes .footnote:last-of-type {
            margin-bottom: 0
        }

        #content #footnotes {
            margin-top: -.625em;
            margin-bottom: 0;
            padding: .75em 0
        }

        .gist .file-data > table {
            border: 0;
            background: #fff;
            width: 100%;
            margin-bottom: 0
        }

        .gist .file-data > table td.line-data {
            width: 99%
        }

        div.unbreakable {
            page-break-inside: avoid
        }

        .big {
            font-size: larger
        }

        .small {
            font-size: smaller
        }

        .underline {
            text-decoration: underline
        }

        .overline {
            text-decoration: overline
        }

        .line-through {
            text-decoration: line-through
        }

        .aqua {
            color: #00bfbf
        }

        .aqua-background {
            background: #00fafa
        }

        .black {
            color: #000
        }

        .black-background {
            background: #000
        }

        .blue {
            color: #0000bf
        }

        .blue-background {
            background: #0000fa
        }

        .fuchsia {
            color: #bf00bf
        }

        .fuchsia-background {
            background: #fa00fa
        }

        .gray {
            color: #606060
        }

        .gray-background {
            background: #7d7d7d
        }

        .green {
            color: #006000
        }

        .green-background {
            background: #007d00
        }

        .lime {
            color: #00bf00
        }

        .lime-background {
            background: #00fa00
        }

        .maroon {
            color: #600000
        }

        .maroon-background {
            background: #7d0000
        }

        .navy {
            color: #000060
        }

        .navy-background {
            background: #00007d
        }

        .olive {
            color: #606000
        }

        .olive-background {
            background: #7d7d00
        }

        .purple {
            color: #600060
        }

        .purple-background {
            background: #7d007d
        }

        .red {
            color: #bf0000
        }

        .red-background {
            background: #fa0000
        }

        .silver {
            color: #909090
        }

        .silver-background {
            background: #bcbcbc
        }

        .teal {
            color: #006060
        }

        .teal-background {
            background: #007d7d
        }

        .white {
            color: #bfbfbf
        }

        .white-background {
            background: #fafafa
        }

        .yellow {
            color: #bfbf00
        }

        .yellow-background {
            background: #fafa00
        }

        span.icon > .fa {
            cursor: default
        }

        a span.icon > .fa {
            cursor: inherit
        }

        .admonitionblock td.icon [class^="fa icon-"] {
            font-size: 2.5em;
            text-shadow: 1px 1px 2px rgba(0, 0, 0, .5);
            cursor: default
        }

        .admonitionblock td.icon .icon-note::before {
            content: "\f05a";
            color: #19407c
        }

        .admonitionblock td.icon .icon-tip::before {
            content: "\f0eb";
            text-shadow: 1px 1px 2px rgba(155, 155, 0, .8);
            color: #111
        }

        .admonitionblock td.icon .icon-warning::before {
            content: "\f071";
            color: #bf6900
        }

        .admonitionblock td.icon .icon-caution::before {
            content: "\f06d";
            color: #bf3400
        }

        .admonitionblock td.icon .icon-important::before {
            content: "\f06a";
            color: #bf0000
        }

        .conum[data-value] {
            display: inline-block;
            color: #fff !important;
            background: rgba(0, 0, 0, .8);
            -webkit-border-radius: 100px;
            border-radius: 100px;
            text-align: center;
            font-size: .75em;
            width: 1.67em;
            height: 1.67em;
            line-height: 1.67em;
            font-family: "Open Sans", "DejaVu Sans", sans-serif;
            font-style: normal;
            font-weight: bold
        }

        .conum[data-value] * {
            color: #fff !important
        }

        .conum[data-value] + b {
            display: none
        }

        .conum[data-value]::after {
            content: attr(data-value)
        }

        pre .conum[data-value] {
            position: relative;
            top: -.125em
        }

        b.conum * {
            color: inherit !important
        }

        .conum:not([data-value]):empty {
            display: none
        }

        dt, th.tableblock, td.content, div.footnote {
            text-rendering: optimizeLegibility
        }

        h1, h2, p, td.content, span.alt {
            letter-spacing: -.01em
        }

        p strong, td.content strong, div.footnote strong {
            letter-spacing: -.005em
        }

        p, blockquote, dt, td.content, span.alt {
            font-size: 1.0625rem
        }

        p {
            margin-bottom: 1.25rem
        }

        .sidebarblock p, .sidebarblock dt, .sidebarblock td.content, p.tableblock {
            font-size: 1em
        }

        .exampleblock > .content {
            background: #fffef7;
            border-color: #e0e0dc;
            -webkit-box-shadow: 0 1px 4px #e0e0dc;
            box-shadow: 0 1px 4px #e0e0dc
        }

        .print-only {
            display: none !important
        }

        @page {
            margin: 1.25cm .75cm
        }

        @media print {
            * {
                -webkit-box-shadow: none !important;
                box-shadow: none !important;
                text-shadow: none !important
            }

            html {
                font-size: 80%
            }

            a {
                color: inherit !important;
                text-decoration: underline !important
            }

            a.bare, a[href^="#"], a[href^="mailto:"] {
                text-decoration: none !important
            }

            a[href^="http:"]:not(.bare)::after, a[href^="https:"]:not(.bare)::after {
                content: "(" attr(href) ")";
                display: inline-block;
                font-size: .875em;
                padding-left: .25em
            }

            abbr[title]::after {
                content: " (" attr(title) ")"
            }

            pre, blockquote, tr, img, object, svg {
                page-break-inside: avoid
            }

            thead {
                display: table-header-group
            }

            svg {
                max-width: 100%
            }

            p, blockquote, dt, td.content {
                font-size: 1em;
                orphans: 3;
                widows: 3
            }

            h2, h3, #toctitle, .sidebarblock > .content > .title {
                page-break-after: avoid
            }

            #toc, .sidebarblock, .exampleblock > .content {
                background: none !important
            }

            #toc {
                border-bottom: 1px solid #dddddf !important;
                padding-bottom: 0 !important
            }

            body.book #header {
                text-align: center
            }

            body.book #header > h1:first-child {
                border: 0 !important;
                margin: 2.5em 0 1em
            }

            body.book #header .details {
                border: 0 !important;
                display: block;
                padding: 0 !important
            }

            body.book #header .details span:first-child {
                margin-left: 0 !important
            }

            body.book #header .details br {
                display: block
            }

            body.book #header .details br + span::before {
                content: none !important
            }

            body.book #toc {
                border: 0 !important;
                text-align: left !important;
                padding: 0 !important;
                margin: 0 !important
            }

            body.book #toc, body.book #preamble, body.book h1.sect0, body.book .sect1 > h2 {
                page-break-before: always
            }

            .listingblock code[data-lang]::before {
                display: block
            }

            #footer {
                padding: 0 .9375em
            }

            .hide-on-print {
                display: none !important
            }

            .print-only {
                display: block !important
            }

            .hide-for-print {
                display: none !important
            }

            .show-for-print {
                display: inherit !important
            }
        }

        @media print, amzn-kf8 {
            #header > h1:first-child {
                margin-top: 1.25rem
            }

            .sect1 {
                padding: 0 !important
            }

            .sect1 + .sect1 {
                border: 0
            }

            #footer {
                background: none
            }

            #footer-text {
                color: rgba(0, 0, 0, .6);
                font-size: .9em
            }
        }

        @media amzn-kf8 {
            #header, #content, #footnotes, #footer {
                padding: 0
            }
        }
    </style>
</head>
<body class="article">
<div id="header">
</div>
<div id="content">
    <div class="sect1">
        <h2 id="_intellij_idea最佳实践">IntelliJ IDEA最佳实践</h2>
        <div class="sectionbody">
            <div class="olist arabic">
                <ol class="arabic">
                    <li>
                        <p>Intellij IDEA for Java WEB 开发</p>
                        <div class="ulist">
                            <ul>
                                <li>
                                    <p>快捷键</p>
                                </li>
                                <li>
                                    <p>插件</p>
                                </li>
                                <li>
                                    <p>快速测试</p>
                                </li>
                                <li>
                                    <p>Java工具包</p>
                                </li>
                            </ul>
                        </div>
                    </li>
                    <li>
                        <p>Intellij IDEA for Scala 开发(ing)</p>
                    </li>
                    <li>
                        <p>Intellij IDEA for Kotlin 开发(ing)</p>
                    </li>
                </ol>
            </div>
            <div class="admonitionblock note">
                <table>
                    <tr>
                        <td class="icon">
                            <div class="title">Note</div>
                        </td>
                        <td class="content">
                            如无特殊说明, 本文基于Mac OS 及Intellij IDEA 2020.1.x,<br>
                            涉及系统或版本差异时会就近补充说明,<br>
                            总体上: Mac的<strong>
                            <mark>cmd</mark>
                        </strong>等价于Windows的<strong>
                            <mark>ctrl</mark>
                        </strong>,<br>
                            Intellij IDEA高版本功能是兼容低版本功能的, 只是部分插件会受到一些影响
                        </td>
                    </tr>
                </table>
            </div>
            <div class="sect2">
                <h3 id="_快捷键">快捷键</h3>
                <div class="ulist">
                    <ul>
                        <li>
                            <p>找到所有快捷键, <code>Help</code> -&#8594; <code>Keymap Reference</code>, 出现的PDF展示了当前你的编辑器的所有快捷键</p>
                        </li>
                        <li>
                            <p>确实有点多, 不着急, 知道了方法, 后续只是时间问题.
                                如何搜索快捷键, 参见下图</p>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="Shortcut" src="http://file.debuggerpowerzcy.top/power/Shortcut.png">
                    </div>
                    <div class="title">Figure 1. 如何搜索快捷键</div>
                </div>
                <table class="tableblock frame-all grid-all stretch">
                    <caption class="title">Table 1. 10个高频快捷键</caption>
                    <colgroup>
                        <col style="width: 33.3333%;">
                        <col style="width: 33.3333%;">
                        <col style="width: 33.3334%;">
                    </colgroup>
                    <thead>
                    <tr>
                        <th class="tableblock halign-left valign-top">功能</th>
                        <th class="tableblock halign-left valign-top">关键词</th>
                        <th class="tableblock halign-left valign-top">示例(默认)快捷键</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">①语句自动完成</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Complete statement</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">cmd + shift + enter</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">②复写(父类)方法</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Override methods | Generate</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">ctrl + O | ctrl + enter</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">③智能提示|纠错</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Show Context Actions</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">ctrl + shift + alt + enter</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">④快速复制粘贴</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Duplicate Line or Selection</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">cmd + D</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑤查看方法调用</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Call Hierarchy</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">ctrl + alt + H</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑥跳转到父类申明</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Go to Super Method</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">cmd + U</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑦跳转到子类实现</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Go to Declaration or Usages</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">cmd + B</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑧拼接下一行</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Join Lines</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">ctrl + shift + J</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑨优化导包</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Optimize Imports</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">ctrl + alt + O</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">⑩格式化代码</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">Reformat Code</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">cmd + alt + L</p></td>
                    </tr>
                    <tr>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">更多彩蛋</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">安装插件 Key Promoter X</p></td>
                        <td class="tableblock halign-left valign-top"><p class="tableblock">对于有快捷键的按钮, 当你点击时提示告诉你快捷键</p></td>
                    </tr>
                    </tbody>
                </table>
            </div>
            <div class="sect2">
                <h3 id="_插件">插件</h3>
                <div class="ulist">
                    <ul>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/9792-key-promoter-x/">Key Promoter X</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>快捷键提示, 新手必备, 而老手也可以通过它得知新版IDEA的一些特性信息</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/">Rainbow Brackets</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>代码括号自动匹配, 彩板护眼</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/6317-lombok/">Lombok</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>这位都听说过吧, 没听过的要么是大佬要么改行吧</p>
                                    </li>
                                    <li>
                                        <p>采坑经验, 使用Lombok时, 尽量避免对象间继承, 如果非要继承, 应考虑@EqualsAndHashCode(callSuper = true : false)</p>
                                    </li>
                                    <li>
                                        <p>示例:</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="listingblock">
                    <div class="content">
<pre class="CodeRay highlight"><code data-lang="jave">/**
 * balabala
 *
 * @author Mr.X
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class PormHub extends GitHub{
    private Boolean well = Boolean.FALSE;
}</code></pre>
                    </div>
                </div>
                <div class="ulist">
                    <ul>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/7391-asciidoc/">AsciiDoc</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>文档编辑神器, AsciiDoc本身目标是制作大型电子书, 超越MarkDown, 本文就是用AsciiDoc书写完成的</p>
                                    </li>
                                    <li>
                                        <p><strong>Spring</strong>官方、<strong>Spring-Alibaba</strong>官方都采用AsciiDoc撰写文档, <strong>GitHub</strong>也支持AsciiDoc, AsciiDoc是未来的主流, MarkDown貌似要成替补了</p>
                                    </li>
                                    <li>
                                        <p>个人使用体验, 对于写技术文档, 上手快, 简洁, 本文的一个小目标就是为新手提供常用的模块, 支持ctrl + c | v</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="AsciiDoc" src="http://file.debuggerpowerzcy.top/power/AsciiDoc.png">
                    </div>
                    <div class="title">Figure 2. AsciiDoc文档速览</div>
                </div>
                <div class="ulist">
                    <ul>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/8579-translation/">Translation</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>作为中国程序员, 英语不会咋办?</p>
                                    </li>
                                    <li>
                                        <p>安装该插件, 选中任意文本, <strong>ctrl + alt + T</strong> 一键翻译</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/6725-ibatis-mybatis-mini-plugin/">iBATIS/MyBatis mini-plugin</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>对于采用Mybatis且保留SQL的方式, 从Mapper接口跳转到对应SQL处, 可以借助该插件完成</p>
                                    </li>
                                    <li>
                                        <p>当然现在有很多采用无SQL的方式, 参见 <a href="https://github.com/baomidou/mybatis-plus">苞米豆</a></p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/7179-maven-helper/">MavenHelper</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>国内Java工程多采用Maven来管理依赖, 对于一些不讲究的老项目, 依赖纠缠不清, 这个时候咋办?</p>
                                    </li>
                                    <li>
                                        <p>就这样, 凉拌吧!</p>
                                    </li>
                                    <li>
                                        <p>又或者, MavenHelper带你浴火重生, 请看下图</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="MavenHelper" src="http://file.debuggerpowerzcy.top/power/MavenHelper.png">
                    </div>
                    <div class="title">Figure 3. MavenHelper特性速览</div>
                </div>
                <div class="ulist">
                    <ul>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/8286-sequencediagram/">SequenceDiagram</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>当我们跳槽后接坑时, 代码的链路是怎样的, 怎么没完没了呢?</p>
                                    </li>
                                    <li>
                                        <p>这个时候, SequenceDiagram带你一览全貌</p>
                                    </li>
                                    <li>
                                        <p>方法调用时序图出来了, 慢慢瞅吧!</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="SequenceDiagram" src="http://file.debuggerpowerzcy.top/power/SequenceDiagram.png">
                    </div>
                    <div class="title">Figure 4. SequenceDiagram特性速览</div>
                </div>
                <div class="ulist">
                    <ul>
                        <li>
                            <p><a href="https://plugins.jetbrains.com/plugin/13576-d8gerautocode/">D8gerAutoCode</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>作为Web开发, 当业务理解清楚后, 开发过程就可以量化如下:</p>
                                        <div class="olist arabic">
                                            <ol class="arabic">
                                                <li>
                                                    <p>表设计</p>
                                                </li>
                                                <li>
                                                    <p>SQL &#8594; Mapper &#8594; Mo &#8594; &#8594; handler &#8594; <strong>Service</strong> &#8594; Controller</p>
                                                </li>
                                                <li>
                                                    <p>自测</p>
                                                </li>
                                                <li>
                                                    <p>联调</p>
                                                </li>
                                                <li>
                                                    <p>PM加需求, 再改一波&#8230;&#8203;</p>
                                                </li>
                                            </ol>
                                        </div>
                                    </li>
                                    <li>
                                        <p>在上诉步骤中, 我认为1、2、3步是自己可以控制的, 且步骤2中除了<strong>Service</strong>层代码由业务决定外, 其他基本代码基本如出一辙</p>
                                    </li>
                                    <li>
                                        <p>这意味着什么?</p>
                                    </li>
                                    <li>
                                        <p>据我的观察, 1-3年的大部分程序员就在写这些重复代码, 有时写错或者抄错了, 到调试时定位到问题, 真的浪费不少时间&#8230;&#8203;</p>
                                    </li>
                                    <li>
                                        <p>好在不少前辈通过创建工具, 以逆向工程方式生成<code><strong>生产环境可用的</strong></code>基础代码, 操作嘛也比较简单, 定义好SQL, 编写配置文件然后运行main方法生成</p>
                                    </li>
                                    <li>
                                        <p>我的编码生涯里也有不少这样的回忆, 只是里面仍旧有不少重复操作, 甚至多人操作时会产生冲突</p>
                                    </li>
                                    <li>
                                        <p>于是, 我从Mo出发, 写了D8gerAutoCode这个插件, 一切以表设计为核心, 你专注设计好Mo就可以, 其他基本代码使用快捷键一键搞定</p>
                                    </li>
                                    <li>
                                        <p>如果D8gerAutoCode只有这个功能, 那其实和其他大佬插件相比没有啥可比性, 大家都用习惯了, 为何要使用新的呢?</p>
                                    </li>
                                    <li>
                                        <p>重点来了: D8gerAutoCode插件专注<strong><code>解决重复</code></strong>, 在平常工作中的重复工作应该被简化, 在我看来, 程序的初衷不就是如此吗?</p>
                                    </li>
                                    <li>
                                        <p>所以, D8gerAutoCode插件还带有字符串批处理, JSON处理, MySQL处理, 字段命名处理, 针对SwaggerAPI文档的处理, 这些功能是项目开发中都会用到的, 本着一键搞定原则而开发, 欲知详情参见后文</p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8Config" src="http://file.debuggerpowerzcy.top/power/D8Config.png">
                    </div>
                    <div class="title">Figure 5. 插件配置</div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8Generate" src="http://file.debuggerpowerzcy.top/power/D8Generate.png">
                    </div>
                    <div class="title">Figure 6. 生成代码</div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8String" src="http://file.debuggerpowerzcy.top/power/D8String.png">
                    </div>
                    <div class="title">Figure 7. 字符串批处理</div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8Format" src="http://file.debuggerpowerzcy.top/power/D8Format.png">
                    </div>
                    <div class="title">Figure 8. 格式化</div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8Regrex" src="http://file.debuggerpowerzcy.top/power/D8Regrex.png">
                    </div>
                    <div class="title">Figure 9. 正则彩蛋</div>
                </div>
            </div>
            <div class="sect2">
                <h3 id="_快速测试">快速测试</h3>
                <div class="ulist">
                    <ul>
                        <li>
                            <p>基于接口进行Http测试</p>
                        </li>
                        <li>
                            <p>整合Swagger-API, 代码及文档, 且支持文档界面进行调试(ing, 后续补充对应的Java实现代码)</p>
                        </li>
                        <li>
                            <p>项目中涉及登录权限等问题, 在HTTP测试时应尽量模拟全, 为前端联调创造真实环境</p>
                        </li>
                        <li>
                            <p>辅助工具</p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>shell + python脚本</p>
                                    </li>
                                    <li>
                                        <p><a href="https://httpie.org/">httpie</a>, 可视化格式化的HTTP请求调用工具包</p>
                                    </li>
                                    <li>
                                        <p><a href="https://github.com/kevinburke/sshpass">sshpass</a>, 登录服务器自动输入指定密码, 可实现自动登录</p>
                                    </li>
                                    <li>
                                        <p><a href="https://github.com/caofanCPU/D8gerConcurrent">D8gerConcurrent</a>, 支持登陆解析、自动封装Cookie、 <a href="http://www.debuggerpowerzcy.top/home/2020/05/15/EasyHttp%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/">接口并发性能测试</a></p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
                <div class="listingblock">
                    <div class="content">
<pre>function downLoadResponse() {
    echo "执行命令内容: \n    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json -d &gt;&gt;~/Desktop/ssoLogin/ResponseBody.json ${@:2}\n"
    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json -d &gt;&gt;~/Desktop/ssoLogin/ResponseBody.json ${@:2}
}

function downLoadExcel() {
    echo "执行命令内容: \n    http --verify=no -v --download  --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json -o ${2}"
    http --verify=no -v --download  --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json -o ${2}
}

function show() {
    echo "执行命令内容: \n    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json ${@:2}\n"
    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} &lt; ~/Desktop/ssoLogin/requestBody.json ${@:2}
}

# 开发环境机器
function xDev() {
    # 借助sshpass工具, 将服务器密码保存在文件第一行, 实现自动登录; 且-t 参数支持登录后跳转到指定目录
    sshpass -f /Users/D8GER/Desktop/CAOFAN/sshpass/caofan-ssh-dev.txt  ssh Mr.X@xxx.xx.xx.${1}  -t  'cd /XXX/logs/; exec $SHELL'
}

# 将HTPP请求的响应结果存入指定文件中, 示例: https-downLoadResponse https://www.baidu.com/
alias https-downLoadResponse='downLoadResponse'
# 在控制台展示完整的HTTP请求过程, 响应打印在控制台, 示例: https-show https://www.baidu.com/
alias https-show='show'
# 对于文件下载, 通过输入参数指定下载后的文件名, 示例: https-downLoadExcel https://www.baidu.com/file/123456 D8ger.zip
alias https-downLoadExcel='downLoadExcel'
# 对于开发测试环境多服务器, 简化为: xDev 99, 则自动登录xxx.xx.xx。99服务器
alias 'xDev=xDev'</pre>
                    </div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="登录获取COOKIE" src="http://file.debuggerpowerzcy.top/power/D8Login.png" width="并写入指定文件">
                    </div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="调用HTTP接口进行测试" src="http://file.debuggerpowerzcy.top/power/D8Http.png">
                    </div>
                </div>
                <div class="paragraph">
                    <p>IMPORT: 采用这种方法, 可以告别PostMan或PostWoman及其他软件了, 你只需要<strong>Intellij IDEA</strong> + <strong>iterm2</strong>|xshell + <strong>python</strong>环境</p>
                </div>
            </div>
            <div class="sect2">
                <h3 id="_java工具包">Java工具包</h3>
                <div class="ulist">
                    <ul>
                        <li>
                            <p>Intellij IDEA代码简化模板, 这个技巧很香的, 比如常见的判断字符串不为空, 我只需要敲下<code><strong>fsnb</strong></code>, 就会得到如下代码</p>
                        </li>
                    </ul>
                </div>
                <div class="listingblock">
                    <div class="content">
<pre>if (StringUtils.isNotBlank(光标在这)) {

}

话不多说, 常用模板定义如下:
/apim : SwaggerModel字段属性模板

oin  : 对象为null         ==&gt; Objects.isNull()
onn  : 对象不为null       ==&gt; Objects.nonNull()
o2e  : 两对象相等          ==&gt; Objects.equals(, )
one  : 两对象不相等        ==&gt; !Objects.equals(, )
foin : 判断对象为null      ==&gt; if (Objects.isNull()) {}
fonn : 判断对象不为null    ==&gt; if (Objects.nonNull()) {}
fo2e : 判断两对象相等      ==&gt; if (Objects.equals(, )) {}
fone : 判断两对象不相等    ==&gt; if (!Objects.equals(, )) {}

cie  : 集合为空           ==&gt; CollectionUtil.isEmpty()
cne  : 集合不为空          ==&gt; CollectionUtil.isNotEmpty()
sib  : 字符串为空          ==&gt; StringUtils.isBlank()
snb  : 字符串不为空        ==&gt; StringUtils.isNotBlank()
fcie : 判断集合为空        ==&gt; if (CollectionUtil.isEmpty()){}
fcne : 判断集合不为空      ==&gt; if (CollectionUtil.isNotEmpty()){}
fsib : 判断字符串为空      ==&gt; if (StringUtils.isBlank()) {}
fsnb : 判断字符串不为空    ==&gt; if (StringUtils.isNotBlank()) {}</pre>
                    </div>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="代码模板" src="http://file.debuggerpowerzcy.top/power/D8LiveTemplate.png">
                    </div>
                </div>
                <div class="ulist">
                    <ul>
                        <li>
                            <p>高频工具包, 推荐GitHub开源项目 <a href="https://github.com/caofanCPU/D8gerStarters">D8gerStarters</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>通用工具包子项目 <a href="https://github.com/caofanCPU/D8gerStarters/tree/master/spring-cloud-starter-d8ger-common-util"><code><strong>spring-cloud-starter-d8ger-common-util</strong></code></a></p>
                                        <div class="olist arabic">
                                            <ol class="arabic">
                                                <li>
                                                    <p>集合流式处理工具<strong>CollectionUtil</strong>, 分组、求和、排序应有尽有, 基本可以告别for循环</p>
                                                </li>
                                                <li>
                                                    <p>树形处理工具<strong>WrapTreeUtil</strong>, 列表与树的多种转换骚操作也是应有尽有, 并且具有无侵入性, 开箱即用</p>
                                                </li>
                                                <li>
                                                    <p>数字精度运算工具<strong>NumberUtil</strong>, 金额进度计算, 精准百分比</p>
                                                </li>
                                                <li>
                                                    <p>枚举处理规范<strong>IEnum</strong>, 为项目打好根基, 规范枚举值用</p>
                                                </li>
                                            </ol>
                                        </div>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p>中间件可插拔Starters整合工具包, 推荐GitHub开源项目 <a href="https://github.com/caofanCPU/D8gerStarters">D8gerStarters</a></p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>通用工具包子项目 <a href="https://github.com/caofanCPU/D8gerStarters/tree/master/spring-cloud-starter-d8ger-web-util"><code><strong>spring-cloud-starter-d8ger-web-util</strong></code></a></p>
                                        <div class="olist arabic">
                                            <ol class="arabic">
                                                <li>
                                                    <p>整合常用中间件, 例如业务线程池、邮件、Redis缓存、RestTemplate调用、消息队列、接口响应消息转换器、SwaggerAPI文档处理器</p>
                                                </li>
                                                <li>
                                                    <p>开关型可插拔, 默认有一套经过大型生产环境检验过的配置, 支持通过配置文件更改配置</p>
                                                </li>
                                                <li>
                                                    <p>保留扩展点, 通过继承等方式覆盖原有组件</p>
                                                </li>
                                            </ol>
                                        </div>
                                    </li>
                                </ul>
                            </div>
                        </li>
                    </ul>
                </div>
            </div>
            <div class="sect2">
                <h3 id="_总结">总结</h3>
                <div class="ulist">
                    <ul>
                        <li>
                            <p>3个开源项目相辅相成, 目的与Spring等框架一致, 解决&#8217;最后一站&#8217;的重复问题, 以工具的使命提高编码效率, 让我们专注于业务开发</p>
                            <div class="ulist">
                                <ul>
                                    <li>
                                        <p>Intelli IDEA智能生码插件, <a href="https://plugins.jetbrains.com/plugin/13576-d8gerautocode/">D8gerAutoCode</a></p>
                                    </li>
                                    <li>
                                        <p>Python脚本, 解决服务器、登录以及HTTP接口测试里的重复工作, <a href="https://github.com/caofanCPU/D8gerConcurrent">D8gerConcurrent</a></p>
                                    </li>
                                    <li>
                                        <p>Java开发者的福利, 炒鸡香的工具集, <a href="https://github.com/caofanCPU/D8gerStarters">D8gerStarters</a></p>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <p><strong>捐赠|Donate</strong>, <strong>实践撰文分享</strong>实属不易, 您的支持能为更多省时省事的分享提速, 如果💰不行, 那就帮上面的开源项目点量⭐吧, 谢谢!</p>
                        </li>
                    </ul>
                </div>
                <div class="imageblock">
                    <div class="content">
                        <img alt="D8WZ" src="http://file.debuggerpowerzcy.top/power/D8WZ.png">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div id="footer">
    <div id="footer-text">
        Last updated 2020-08-30 00:02:13 +0800
    </div>
</div>
</body>
</html>